package com.fowo.api.documentCirculation.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fowo.api.common.model.PageAndStatistics;
import com.fowo.api.common.model.PageSearch;
import com.fowo.api.documentCirculation.model.DataTaskRuntimeModel;
import com.fowo.api.documentCirculation.model.FromDataPageSearch;
import com.fowo.api.documentCirculation.model.PullCancelRequestPo;
import com.fowo.api.documentCirculation.model.PushDownRequestPo;

import java.util.List;
import java.util.Map;

/**
 * 单据流转运行时服务
 * @author yl_ls
 */
public interface DocumentCirculationRuntimeService {
    /**
     * 按配置主键获取单据流转运行时模型
     * @param id 主键
     * @return 单据流转运行时模型
     */
    DataTaskRuntimeModel getModelById(Long id) throws Exception;

    /**
     * 按配置编号获取单据流转运行时模型
     * @param code 编号
     * @return 单据流转运行时模型
     */
    DataTaskRuntimeModel getModalByCode(String code) throws Exception;

    /**
     * 下推
     * @param requestPo 下推请求
     * @throws Exception 处理时异常
     */
    void pushDown(PushDownRequestPo requestPo) throws Exception;

    /**
     * 勾稽
     * @param requestPo 勾稽请求
     * @throws Exception 处理时异常
     */
    void pullUp(PushDownRequestPo requestPo) throws Exception;

    /**
     * 整单下推
     * @param dataTaskId 任务主键
     * @param fromOrderId 主表编号
     * @throws Exception 处理时异常
     */
    void pushDownWholeOrder(Long dataTaskId, Long fromOrderId) throws Exception;

    /**
     * 勾稽取消
     * @param requestPo
     * @throws Exception
     */
    void pullCancel(PullCancelRequestPo requestPo) throws Exception;


    /**
     * 导入勾稽数据与原表做关联
     * @param dataTaskId 任务Id
     * @param toMainId   目标主表Id
     * @return
     */
    void pullAssociation(Long dataTaskId, Long toMainId) throws Exception;


    /**
     * 查询是否生成目标数据
     * @param dataTaskId
     * @param fromMainId
     * @return
     * @throws Exception
     */
    Boolean getPullData(Long dataTaskId,Long fromMainId) throws Exception;


    /**
     * 删除单据前需判断是否返回数量到原表
     * @param dataTaskId   任务Id
     * @param toMainId      目标主表Id
     * @return
     */
    Boolean getExistToNum(Long dataTaskId,Long toMainId) throws Exception;


    /**
     * 批量整单下推，其中任何一个处理失败都会整体回滚
     * @param dataTaskId 任务主键
     * @param fromOrderIdList 主表编号列表
     * @throws Exception 处理时异常
     */
    void batchPushDownWholeOrder(Long dataTaskId, List<Long> fromOrderIdList) throws Exception;

    /**
     * 获取一个事务的源表分页记录
     * @param dataTaskId 任务主键
     * @param mainDataId 主数据编号
     * @param pageSearch 表查询条件
     * @return 分页查询结果
     */
    Page<Map<String, Object>> fromDataSearchPage(Long dataTaskId, Long mainDataId, FromDataPageSearch pageSearch) throws Exception;

    /**
     * 获取一个事务的源主表分页记录
     * @param dataTaskId 任务主键
     * @param toMainDataId 目标主数据编号
     * @param pageSearch 表查询条件
     * @return 分页查询结果
     */
    Page<Map<String, Object>> toFromMainSearchPage(Long dataTaskId, Long toMainDataId, PageSearch pageSearch) throws Exception;

    /**
     * 获取一个事务特定目标的源表分页记录
     * @param dataTaskId 任务主键
     * @param toMainDataId 目标主数据编号
     * @param pageSearch 表查询条件
     * @return 分页查询结果
     */
    PageAndStatistics<Map<String, Object>> toFromDataSearchPage(Long dataTaskId, Long toMainDataId, PageSearch pageSearch) throws Exception;

    /**
     * 通过历史记录返回勾稽缓存区的最后状态
     * @param dataTaskId 任务主键
     * @param toMainDataId 目标主数据编号
     * @return 历史勾稽列表
     */
    List<Map<String, Object>> toDataList(Long dataTaskId, Long toMainDataId) throws Exception;

    /**
     * 自动勾稽创建历史日志更新原表记录
     * @param dataTaskId  任务主键
     * @param toMainId   目标主数据编号
     * @throws Exception
     */
    void pullUpDataTaskLog(Long dataTaskId, Long toMainId) throws Exception;
}
